#ifndef ABSTRACTFACTORY_HH
#define ABSTRACTFACTORY_HH
#include <iostream>
#include <map>

#define T int

using namespace std;
/*
*
* Remplacer T par le type Interface d'objet à creer par la factory, i.e IButton pour plusieurs button differents
*
*/

class MyFactory
{
private:
    static map<string, T*> theMap;

    MyFactory()
    {
    }

public:

    /*
    * la fonction est static pour pouvoir l'appeler sans avoir à instancier la factory
    */
    static void register(string ext, T* loader)
    {
        if(loader)
        {
            theMap[ext] = loader;
        }
    }

    static T* create(string s)
    {
        map<string, T*>::iterator it = theMap.find(s);

        if(it != theMap.end()){
        return new theMap[s]();
        }
        else{
            cout<<"404 : l'object "<<s<<" n est pas enregistrer dasn la factory!"<<endl;
            return NULL;

        }

    }


};

map<string, T*> theMap;

#endif
